Avoid holding onto the buffer when parsing unknown length-delimited fields #863
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently unknown field set parser stores length-delimited fields as views of the input buffer. This has a few issues:
It's inconsistent with the known-field parsing where we copy
bytes
fields.A single unknown length-delimited field can cause keeping a large input buffer alive.
Because the caller is free to modify the input buffer, this implementation does not allow freezing an unknown field set.
(This can also be fixed by copying the length-delimited fields when freezing.)
Even when the parsed message is not frozen, this aliasing can cause bugs as it's not documented. Even if we document it, it would probably be a footgun.
This can cause segfaults or worse when the input buffer is passed from e.g. C++ or C as a
Uint8List
, and the caller frees the buffer after parsing while the message is still in use.This PR makes
readBytes
copy the bytes before returning to avoid aliasing. A new memberreadBytesAsView
added with the previous behavior. Unknown length-delimited field parsing fixed with the newreadBytes
.Sync CL: cl/552077275